import java.util.Arrays;

//形参的指向不会影响实参的指向
//形参的改变不会影响实参的值
//当数组作为参数进行传递的时候，其实还是按值传递，只不过测试的值是一个地址！那么就会出现两种情况
//1.形参修改指向：array = new int[10];   只会影响形参的指向
//2.形参修改指向的值：array[0] = 9;       此时才会影响到实参

public class Test {

    public static int find(int[] array,int val) {
        for (int i = 0; i < array.length; i++) {
            if(array[i] == val) {
                return 1;
            }
        }
        return  -1;
    }
    public static void main(String[] args) {
        int[] array1 = {1,2,3,4};
        int ret = find(array1,4);
        System.out.println(ret);
    }
    public static void main11(String[] args) {
        int[] array1 = {1,2,3,4};
        int[] array2 = array1.clone();//产生了一个副本
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
        System.out.println("==================");
        array2[0] = 199;
        System.out.println(Arrays.toString(array1));//1 2 3 4
        System.out.println(Arrays.toString(array2));//199 2 3 4


    }

    //练习

    //查看输出
    public static void main10(String[] args) {
        int[] array = {1,2,3,4};
        int[] array2 = new int[array.length];//array2是一块独立的空间

        for (int i = 0; i < array.length; i++) {
            array2[i] = array[i];
        }
        array2[0] = 199;
        System.out.println(Arrays.toString(array));//1 2 3 4
        System.out.println(Arrays.toString(array2));//199 2 3 4

    }

    //2.数组拷贝
    //2.1自己写拷贝
    public static void main8(String[] args) {
        int[] array = {1,2,3,4};
        int[] array2 = new int[array.length];

        for (int i = 0; i < array.length; i++) {
            array2[i] = array[i];
        }
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(array2));

    }
    //2.2JDK提供的拷贝方法
    public static void func() {
        // newArr和arr引用的是同一个数组
        // 因此newArr修改空间中内容之后，arr也可以看到修改的结果
        int[] arr = {1, 2, 3, 4, 5, 6};
        int[] newArr = arr;
        newArr[0] = 10;
        System.out.println("newArr: " + Arrays.toString(arr));
        // 使用Arrays中copyOf方法完成数组的拷贝：
        // copyOf方法在进行数组拷贝时，创建了一个新的数组
        // arr和newArr引用的不是同一个数组
        arr[0] = 1;
        newArr = Arrays.copyOf(arr, arr.length);
        System.out.println("newArr: " + Arrays.toString(newArr));
        // 因为arr修改其引用数组中内容时，对newArr没有任何影响
        arr[0] = 10;
        System.out.println("arr: " + Arrays.toString(arr));
        System.out.println("newArr: " + Arrays.toString(newArr));
        // 拷贝某个范围.
        int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);
        System.out.println("newArr2: " + Arrays.toString(newArr2));
    }
    public static void main9(String[] args) {
        int[] array = {1,2,3,4};
        int[] ret = Arrays.copyOf(array,array.length);
        int[] ret2 = Arrays.copyOf(array,array.length*2);//  扩容
        System.out.println(Arrays.toString(ret));
        System.out.println(Arrays.toString(ret2));
    }

/////////////////////////////////////////////////////////
    //1.自己写一个方法，实现输出字符串
    public static String myToString(int[] array) {
        if(array == null) {
            return "null";
        }
        String ret = "[";
        for (int i = 0; i < array.length; i++) {
            ret += array[i];
            if(i != array.length - 1) {
                ret += " ,";
            }
        }
        ret = ret + "]";
        return ret;
    }
    public static void main7(String[] args) {
        int[] array = {1,2,3,4};
        System.out.println(myToString(array));
        System.out.println(myToString(null));
    }
    /////////////////////////////////////////////////////////
    public static int[] grow3(int[] array) {
        int[] tmpArray = new int[array.length];//重新申请内存
        for (int i = 0; i < array.length; i++) {
            tmpArray[i] = array[i] * 2;
        }
        return tmpArray;
    }
    public static void main6(String[] args) {
        int[] array = {1,2,3,4,5,6};
        int ret[] = grow3(array);
        System.out.println(Arrays.toString(array));//1 2 3 4 5 6
        System.out.println(Arrays.toString(ret));//2 4 6 8 10 12

    }
    ////////////////////////////////////////////////////
    public static void grow2(int[] array) {
        for (int i = 0; i < array.length; i++) {
            array[i] = array[i] * 2;
        }
    }
    public static void main5(String[] args) {
        int[] array = {1,2,3,4,5,6};
        grow2(array);
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(array));
        //二者值相同 相当于是在同一个对象上进行了修改

    }
    ///////////////////////////////////////////////////
    public static int[] grow(int[] array) {
        for (int i = 0; i < array.length; i++) {
            array[i] = array[i] * 2;
        }
        return array;
    }
    public static void main4(String[] args) {
        int[] array = {1,2,3,4,5,6};
        int ret[] = grow(array);
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(ret));
        //二者值相同 相当于是在同一个对象上进行了修改

    }

    public static int[] func10() {
        int[] tmpArr = {10,11,12};
        return tmpArr;
    }
    public static void main3(String[] args) {
        //int[] array = {1,3,5,7,9};
        int[] array = func10();
        System.out.println(Arrays.toString(array))
        ;
    }

    public static void func1(int[] array) {
        array = new int[]{15,16,17};//只是改变了形参的指向，没有改变实参的指向，形参的指向不会影响实参的指向
    }
    public static void func2(int[] array) {
        array[0] = 999;//此时传递的是引用，我们通过这个引用修改了原来的值，改变了形参指向对象的下标
    }
    public static void main2(String[] args) {
        int[] array1 =  {1,2,3,4};
        //func1(array1);
        func2(array1);
        System.out.println(Arrays.toString(array1));
    }
    public static void main1(String[] args) {
        //java当中 局部变量在使用的时候，必须初始化
        //通过其中任何一个引用修改这个对象的值，另一个引用去访问的时候，也是被改变的
        //注意：java当中并没有约定null和0号地址的内存有任何关联
        int[] array1 = {1,2,3,4};
        int[] array2 = {11,22,33,44};
        array1 = array2;
        array1[0] = 1888;
        System.out.println(Arrays.toString(array1));//1888,22,33,44
        System.out.println(Arrays.toString(array2));//1888,22,33,44 因为地址相同

        int[] array4 = null;
        System.out.println(array4);//array4这个引用不指向任何对象，所以在书写的时候直接赋值null

    }
}
